//

import frameFormat from './frame.json' assert {type: 'json'};
import {telemetryParser} from "../../utils/byteParser.js";

function hexToBinary(hexString) {
    return hexString.match(/.{1,2}/g)  // 先按2个字符一组（1字节）拆分
        .map(byte => parseInt(byte, 16).toString(2).padStart(8, '0')) // 转二进制
        .join(''); // 拼接成完整的二进制字符串
}

function binaryToHex(binaryString) {
    // 确保二进制字符串长度是4的倍数，不足时在前面补0
    const paddedBinary = binaryString.padStart(Math.ceil(binaryString.length / 4) * 4, '0');
    try {
        // 按每4位一组分割，并转换成十六进制
        const hexString = paddedBinary.match(/.{1,4}/g)  // 每4位分一组
            .map(bin => parseInt(bin, 2).toString(16))  // 转成十六进制
            .join('');  // 拼接成十六进制字符串
        return hexString;
    } catch (e) {
        console.log(binaryString, "二进制转八进制出现错误")
    }

}

let text = `
eb90442255000001eb9a000000000e000002ad029baa001f23253f00b809d836a2008ee18ad884f686e2ef00060000134dffff6404000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3500000c35000000000005555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555006b09d7eb90442255000002eb9a000000000e000002ad02a5aa001f25253f00b909d5369b0090e18cd883f678e2ec000600001360ffff642f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3500000c35000000000005555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555009f09d7eb90442255000003eb9a000000000e000002ad02afaa004c3c264e00bf0aba35b1008ae188d883f687e2ed000600001360ffff642f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3500000c35000000000005555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555000509d7eb90442255000004eb9a000000000e000002ad02b9aa001f20253d00be09d9369a007ae18ad882f686e2ed000600001360ffff642f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3500000c3500000000000555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555500ac09d7eb90442255000005eb9a000000000e000002ad02c3aa001f23254100ba09d53695007be18bd885f685e2ef000600001360ffff6419000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3500000c3500000000000555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555500a109d7eb90442255000006eb9a000000000e000002ad02cdaa001f23254200b709d7369a0078e189d881f682e2ea000600001360ffff6444000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3500000c3500000000000555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555500cb09d7eb90442255000007eb9a000000000e000002ad02d7aa001f21253f00b809d7369d008fe187d882f684e2ea000600001388ffff645a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3500000c35000000000005555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555002b09d7eb90442255000008eb9a000000000e000002ad02e1aa001f23253c00bd0abc35ae008fe186d883f67ee2e8000600001374ffff645a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3500000c35000000000005555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555001409d7eb90442255000009eb9a000000000e000002ad02ebaa001f21254200ba09d0369c009be187d87ff682e2e9000600001388ffff645a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3500000c35000000000005555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555004409d7eb9044225500000aeb9a000000000e000002ad02f5aa001f1e254200c409d33694007ae187d87af67ee2e5000600001374ffff6444000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3500000c3500000000000555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555500f909d7eb9044225500000beb9a000000000e000002ad02ffaa001f27254300bb09d53696007ee188d885f683e2e9000600001388ffff645a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3500000c35000000000005555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555004c09d7eb9044225500000ceb9a000000000e000002ad0309aa001f1d254000c109d83694007ae189d880f684e2ee00060000139bffff645a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3500000c35000000000005555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555006309d7eb9044225500000deb9a000000000e000002ad0313aa001f24253f00be09d236980086e18ad880f684e2ee0006000013afffff649a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3500000c350000000000055555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555`


/**
 * 获取帧类型,返回对应类型的配置
 * @param hexString 一条大帧
 */
function getFrameType(hexString) {
    let typeBits = 16 + 8 + 8
    let flag = `0x${hexString.substr(typeBits / 4, 2)}`
    // 获取对应遥测类型的配置
    return frameFormat[0].params[3].enum[flag]
}

/**
 * 从大帧中提取遥测帧(1960bit)
 * @param hex
 */
function extractDataSegment(hex) {
    // 去除帧首部32bit, eb904422, 尾部24bit
    return hex.slice((16 + 8 + 8 + 8 + 24) / 4, -(16 + 8))
}

let sbg = "eb9a000000000e000002ad029baa001f23253f00b809d836a2008ee18ad884f686e2ef00060000134dffff6404000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3500000c3500000000000"


/**
 * 1.先对bin文件读取并转成hexString
 * 2.分割出合格的大帧
 * 3.获取大帧的遥测类型,一次获取决定下面所有的帧
 * 4.针对类型做数据解析
 */

export function unpackFrame(hexs) {
    let res = []
    // 解大帧 512字符-8首位字符, 为实际数据段
    const eb90Regex = new RegExp(`eb90[\\s\\S]{${frameFormat[0].bit_length/4-8}}09d7`, 'gi');
    // 所有大帧
    const matches = hexs.match(eb90Regex);

    // 对帧的格式进行解析, 获取遥测类型对每个大帧进行对应子帧的解析操作
    const frameConfig = getFrameType(matches[0]).params
    // 根据帧类型调用不同处理方式
    matches.forEach((value) => {
        res.push(unpackEB9A(value, frameConfig))
    })
    return res
}


/**
 * 处理扫捕跟帧的解析
 */
function unpackEB9A(hexString, frameConfig) {
    const segment = extractDataSegment(hexString)
    const fmt_lst = frameFormat[0].params[3].enum["0x55"].params.map(item => `${item.type}${item.bit_length}`)
    const parsedData = telemetryParser(
        frameConfig,
        segment,
        fmt_lst
    )
    return parsedData
}


/**
 * [
 *     {
 *         帧头:, 源地址:
 *     }
 * ]
 */
function unpackEB90() {
    matches.forEach((value, index) => {
        let startIndex = 0
        let framePacks = []
        for (const p of frame[0].params) {
            // 遍历每个参数
            // 1. 转换为二进制
            const binaryStr = hexToBinary(value);

            // 2. 逐个拆分
            let segment = binaryStr.slice(startIndex, startIndex + p.bit_length);
            framePacks.push({label: p.name, raw: binaryToHex(segment)})
            startIndex += p.bit_length
        }
        frames.push(framePacks)
    })
}